package com.juzi.polymorphic;

public class Introduce {
    public static void main(String[] args) {
        System.out.println("=============================\n" +
                "什么是多态？\n" +
                "指对象可以有多种形态。\n" +
                "--------------------------------------\n" +
                "多态的常见形式\n" +
                "父类类型 对象名称 = new 子类构造器;\n" +
                "--------------------------------------\n" +
                "多态中成员访问特点\n" +
                "方法调用：编译看左边，运行看右边。\n" +
                "变量调用：编译看左边，运行也看左边。（注意）\n" +
                "--------------------------------------\n" +
                "多态的前提\n" +
                "有继承/实现关系；有父类引用指向子类对象；有方法重写（多态侧重行为多态）。\n"+
                "--------------------------------------\n" +
                " 优势\n" +
                "在多态形式下，右边对象可以实现解耦合，便于扩展和维护。\n" +
                "Animal a = new Dog();\n" +
                "a.run(); // 后续业务行为随对象而变，后续代码无需修改\n" +
                "定义方法的时候，使用父类型作为参数，该方法就可以接收这父类的一切子类对象，体现出多态的扩展性与便利。\n" +
                "--------------------------------------\n" +
                "多态下会产生的一个问题:\n" +
                "多态下不能使用子类的独有功能\n" +
                "\n" +
                "--------------------------------------\n" +
                "自动类型转换（从子到父)：Animal c = new Cat();\n" +
                "--------------------------------------\n" +
                "强制类型转换（从父到子)\n" +
                "从父到子（ 必须进行强制类型转换,否则报错）:  子类 对象变量 = (子类)父类类型的变量\n" +
                " 作用：可以解决多态下的劣势，可以实现调用子类独有的功能。\n" +
                " 注意： 有继承/实现关系的类就可以在编译阶段进行强制类型转换；但是，如果转型后的类型和对象真实对象的类型不是同一种类型，那么在运行代码时，就会出现ClassCastException\n" +
                "Animal c = new Cat();\n" +
                "Dog d = (Dog)c; // 出现异常 ClassCastException\n" +
                "\n" +
                "Java建议强转转换前使用instanceof判断当前对象的真实类型，再进行强制转换\n" +
                "变量名 instanceof 真实类型\n" +
                "判断关键字左边的变量指向的对象的真实类型，是否是右边的类型或者是其子类类型，是则返回true，反之。\n" +
                "--------------------------------------\n" +
                "引用数据类型的类型转换，有几种方式？\n" +
                " 自动类型转换、强制类型转换。\n" +
                "--------------------------------------\n" +
                "强制类型转换能解决什么问题？\n" +
                " 可以转换成真正的子类类型，从而调用子类独有功能。\n" +
                "--------------------------------------\n" +
                "强制类型转换需要注意什么？\n" +
                " 有继承关系/实现的2个类型就可以进行强制转换，编译无问题。\n" +
                " 运行时，如果发现强制转换后的类型不是对象真实类型则报错（ClassCastException）\n" +
                "--------------------------------------\n" +
                "强制类型转换前最好做什么事情，如何进行？\n" +
                " 使用instanceof判断当前对象的真实类型，再进行强制转换\n" +
                " 对象变量名 instanceof 真实类型\n" +
                "");
    }
}
